#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include<string.h>


//测试代码，与正题无关

//void main(void)
//{
//	char line[81];
//
//	printf("Input a string: ");
//	gets(line);
//	printf("The line entered was: %s\n", line);//定义了char类型line数组，gets输入该数组元素
//}


//void xs(int arr[], int az)
//{
//	int ff = arr[1];
//	arr[1] = arr[2];
//	arr[2] = ff;
//}
//
//void print(int arr[],int az)
//{
//	for (int i = 0; i < az; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//
//}
//
//int main()
//{
//	/*int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int az = sizeof(arr) / sizeof(arr[0]);
//	xs(arr, az);
//	print(arr,az);*/
//
//	char sss[100] = "ni hao";
//	size_t len = strlen(sss);//size_t的本质就是unsighed int
//	printf("%zd\n", len);//结果为6，计算了空格的
//	return 0;
//}



//正题：

//int main()
//{
//	unsigned long pulArray[] = { 6,7,8,9,10 };
//	unsigned long* pulPtr;
//	pulPtr = pulArray;//这里的pulArray表示数组第一个元素的地址，所以打印pulPtr会打印第一个元素6
//	*(pulPtr + 3) += 3;//第一个元素的地址加上3，随后进行解引用操作，于是打印第四个元素，加上3就是12
//	printf("%d,%d\n", *pulPtr, *(pulPtr + 3));
//	//结果为6,12
//
//
//	int a = 0x11223344;//指针在x86中是四个字节，十六位进制数刚好存储在四个字节中：44 33 22 11
//	char* pc = (char*)&a;
//	*pc = 0;//a是十六进制数，char类型的指针一次只能更改一字节，*pc是a第一个字节地址，所以更改为0，打印结果为0x11223300
//	printf("%x\n", a);
//	return 0;
//}

//将一个字符串str的内容颠倒过来，并输出。
//数据范围：1≤len(str)≤10000
//输入描述:
//输入一个字符串，可以有空格
//输出描述:
//输出逆序的字符串
//
//示例1
//输入
//I am a student
//输出
//tneduts a ma I

//int main()
//{
//	//输入一个字符串
//	char character[10000];
//	gets(character);
//
//	size_t len = strlen(character);
//	//for循环，从最后一位逆序开始打印
//	for (int i = len - 1; i >= 0; i--)
//	{
//		printf("%c", character[i]);
//	}
//	return 0;
//}


//实现一个函数，可以左旋字符串中的k个字符。
//例如：
//ABCD左旋一个字符得到BCDA
//ABCD左旋两个字符得到CDAB

//void rotate(char s[], int k)//用数组s接受
//{
//	int len = strlen(s);
//	k = k % len;//当右移k次，k远大于字符串长度时，例如字符串长度为3，移动5次，那就相当于移动2次，计算出真实有效移动次数k
//	int n = 0;
//	for (int i = 0; i < k; i++)
//	{
//		n = s[0];//n来保存数组首元素
//		int j = 0;
//		for (j = 0; j < len - 1; j++)
//		{
//			s[j] = s[j + 1];//移动
//		}
//		s[j] = n;//让最后一个元素的值等于首元素，一次移动完成
//	}
//}
//
//int main()
//{
//	char cha[1000];
//	gets(cha);
//	int k = 0;
//	int n = strlen(cha);
//	/*printf("%d", n);*/
//	scanf("%d", &k);
//	rotate(cha, k);
//	for (int i = 0; i < n; i++)
//	{
//		printf("%c", cha[i]);
//	}
//	
//
//	return 0;
//}

void reverse_part(char *str, int start, int end) //将字符串从start到end这一段逆序
{
	int i, j;
	char tmp;

	for (i = start, j = end; i < j; i++, j--)
	{
		tmp = str[i];
		str[i] = str[j];
		str[j] = tmp;
	}
}

void leftRound(char * src, int time)
{
	int len = strlen(src);
	int pos = time % len;
	reverse_part(src, 0, pos - 1); //逆序前段
	reverse_part(src, pos, len - 1); //逆序后段
	reverse_part(src, 0, len - 1); //整体逆序
}


//模拟实现库函数strlen

//int strlens(const char arr[])//选择用数组接收
//{
//	int count = 0;
//	int i = 0;
//	while (arr[i] != '\0')
//	{
//		count++;
//		i++;
//	}
//	return count;
//}
//int strlens(const char arr[])
//{
//	int count = 0;
//	char* s = arr;//用数组接收后创建指针
//	int i = 0;
//	while (*s !='\0')//也可以是:while(*s),因为*s等于\0时，ASCII码值等于0
//	{
//		count++;
//		s++;
//	}
//	return count;
//}

int strlens(const char *s)//用指针接收地址
{
	int count = 0;
	while (*s != '\0')
	{
		count++;
		s++;
	}
	return count;
}

int main()
{
	char arr[] = "abcdefg";
	int n = strlens(arr);//传递arr数组的首元素地址
	printf("%d", n);
	return 0;
}